package artesis.sysanalyse.klasses;

import artesis.sysanalyse.abstracteKlasses.Plaats;
import java.util.ArrayList;
import java.util.Date;

/**
 * Klasse Optreden
 * 
 * @author Ruben Van Laerhoven
 * @since 2011 05 10
 * @version 2011 05 15
 */
public class Optreden {
    
    public static final int INGEPLAND = 1;
    public static final int PLAATSEN_TOEGEVOEGD = 2;
    public static final int NIET_AANPASBAAR = 3; // reservaties aanwezig
    public static final int BEEINDIGD = 4;
    public static final int GEANNULEERD = 5;
    // opgelet: zorg ervoor dat deze statussen steeds aanwezig zijn in
    // de methode setStatus();
    public static final Date MIN_DATUM = new Date(2001,1,1);
    
    public Optreden(Artiest artiest, String naam, Date datum, Date startUur, 
            Date eindUur) {
        this._artiest = artiest;
        this._naam = naam;
        this._datum = datum;
        this._startUur = startUur;
        this._einduur = eindUur;
        this._plaatsen = new ArrayList<Plaats>();
        this._status = INGEPLAND;
    }
    
    public Optreden(Artiest artiest, String naam, Date datum, Date startUur,
            Date eindUur, ArrayList<Plaats> plaatsen) {
        this(artiest, naam, datum, startUur, eindUur);
        this._plaatsen = plaatsen;
        this._status = PLAATSEN_TOEGEVOEGD;
    }
    
    // wordt aangeroepen wanneer er een reservatie wordt gedaan in Plaats
    public void controleReservaties() {
        if (_status != BEEINDIGD && _status != GEANNULEERD) {
            if (_plaatsen.size() > 0) {
                // zie FSM statusverandering tussen 1 & 2 (kan in twee richtingen)
                boolean bestaatReservatie = false;
                for (Plaats plaats : _plaatsen) {
                    if (plaats.get_reservatieId() != 0)
                        bestaatReservatie = true;
                }
                if (bestaatReservatie)
                    set_status(NIET_AANPASBAAR);
                else
                    set_status(PLAATSEN_TOEGEVOEGD);
            }
            else {
                set_status(INGEPLAND);
            }
        }
        
    }
    
    public void beeindigenOptreden() {
        if (_status == NIET_AANPASBAAR) {
            set_status(BEEINDIGD);
            for (Plaats plaats : _plaatsen) {
                plaats.beeindigen();
            }
        }
    }
    
    public void annulerenOptreden() {
        if (_status == INGEPLAND || _status == PLAATSEN_TOEGEVOEGD) {
            set_status(GEANNULEERD);
            for (Plaats plaats : _plaatsen) {
                plaats.beeindigen();
            }
        }
    }
    
    public boolean  plaatsToevoegen(Plaats plaats) {
        if (_status != BEEINDIGD && _status != GEANNULEERD
                || _status != NIET_AANPASBAAR) {
            return this._plaatsen.add(plaats);
        }
        return false;
    }
    
    public boolean plaatsVerwijderen(int index) {
        if (_status != BEEINDIGD && _status != GEANNULEERD
                || _status != NIET_AANPASBAAR) {
            Plaats plaats = this._plaatsen.get(index);
            if (plaatsMagVerwijderdWorden(plaats)) {
                this._plaatsen.remove(index);
                return true;
            }
        }
        return false;
        
    }
    
    public boolean plaatsVerwijderen(Plaats plaats) {
        if (_status != BEEINDIGD && _status != GEANNULEERD
                || _status != NIET_AANPASBAAR) {
            if (plaatsMagVerwijderdWorden(plaats)) {
                this._plaatsen.remove(plaats);
                return true;
            }
        }
        return false;
    }
    
    private boolean plaatsMagVerwijderdWorden(Plaats plaats) {
        if (plaats.get_reservatieId() != 0) {
            return false;
        }
        return true;
    }

    public Artiest getArtiest() {
        return _artiest;
    }
    public void setArtiest(Artiest artiest) {
        if (_status != BEEINDIGD && _status != GEANNULEERD
                || _status != NIET_AANPASBAAR) {
            this._artiest = artiest; 
        }
    }
    
    public String getNaam() {
        return _naam;
    }
    public void setNaam(String naam) {
        if (_status != BEEINDIGD && _status != GEANNULEERD
                || _status != NIET_AANPASBAAR) {
            this._naam = naam;
        }
    }
    
    public Date getDatum() {
        return _datum;
    }
    public void setDatum(Date datum) {
        if (datum.after(MIN_DATUM) && _status != BEEINDIGD
                || _status != NIET_AANPASBAAR) {
            this._datum = datum;
        }
    }
    
    public Date get_startUur() {
        return _startUur;
    }
    public void set_startUur(Date _startUur) {
        if (_status != BEEINDIGD && _status != GEANNULEERD
                || _status != NIET_AANPASBAAR) {
            this._startUur = _startUur;
        }
    }
    
    public Date get_einduur() {
        return _einduur;
    }
    public void set_einduur(Date _einduur) {
        if (_status != BEEINDIGD && _status != GEANNULEERD
                || _status != NIET_AANPASBAAR) {
            this._einduur = _einduur;
        }
    }
    
    public int get_status() {
        return _status;
    }

    public final void set_status(int status) {
        if (status == INGEPLAND || status == NIET_AANPASBAAR 
                || status == PLAATSEN_TOEGEVOEGD || status == BEEINDIGD
                || status == GEANNULEERD) {
            this._status = status;
        }
        else {
            throw new IllegalArgumentException("Geen gekende optredenStatus!");
        }
    }
    
    private Artiest _artiest;
    private String _naam;
    private Date _datum;
    private int _status;
    
    private Date _startUur;
    private Date _einduur;

    private ArrayList<Plaats> _plaatsen;

}
